/**!
 *
 * jQuery 工具类。
 *
 */

(function ($) {
    /** ajax 的总个数 */
    var ajaxCount = 0;
    /** 显示等待框的 ajax 的个数 */
    var loadingAjaxCount = 0;
    /** 提交按钮的名称 */
    var submitBtnName = "提交";

    /**
     * 对象为空。
     *
     * @param o 对象
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-为空；</li>
     *    <li>false-不为空。</li>
     * </ol>
     */
    $.isNull = function (o) {
        try {
            if (($.type(o) === "undefined") || (o == null)) {
                return true;
            }

            return false;
        } catch (e) {
            return true;
        }
    };

    /**
     * 对象不为空。
     *
     * @param o 对象
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-不为空；</li>
     *    <li>false-为空。</li>
     * </ol>
     */
    $.isNotNull = function (o) {
        return !$.isNull(o);
    };

    /**
     * 字符串为空。
     *
     * @param str 字符串
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-为空；</li>
     *    <li>false-不为空。</li>
     * </ol>
     */
    $.isBlank = function (str) {
        try {
            if (($.type(str) === "undefined") || (str == null)) {
                return true;
            } else if (($.type(str) === "number") || ($.type(str) === "boolean")) {
                return false;
            } else if ($.type(str) === "string") {
                if ($.trim(str).length === 0) {
                    return true;
                } else {
                    return false;
                }
            }

            return true;
        } catch (e) {
            return true;
        }
    };

    /**
     * 字符串不为空。
     *
     * @param str 字符串
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-不为空；</li>
     *    <li>false-为空。</li>
     * </ol>
     */
    $.isNotBlank = function (str) {
        return !$.isBlank(str);
    };

    /**
     * 判断变量 v 是否存在。
     *
     * @param v 变量
     * @returns {Boolean} 是否存在：
     * <ol>
     *    <li>true-存在；</li>
     *    <li>false-不存在。</li>
     * </ol>
     */
    $.isVarExists = function (v) {
        try {
            if ($.type(v) === "undefined") {
                return false;
            }

            return true;
        } catch (e) {
            return false;
        }
    };

    /**
     * 判断非空变量是否为原生对象。
     *
     * @param o 变量
     * @returns {Boolean} 是否为原生对象：
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     */
    $.isObject = function (o) {
        try {
            return $.isPlainObject(o);
        } catch (e) {
            return false;
        }
    };

    /**
     * 判断非空变量是否为 jQuery 对象。
     *
     * @param o 变量
     * @returns {Boolean} 是否为 jQuery 对象：
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     */
    $.is_jQueryObj = function (o) {
        try {
            return ($.isNotNull(o) && $.isNotBlank(o.jquery) && (o.length > 0));
        } catch (e) {
            return false;
        }
    };

    /**
     * 判断变量是否为数字。
     *
     * @param o 变量
     * @returns {Boolean} 是否为数字：
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     */
    $.isNumber = function (o) {
        try {
            return $.isNumeric(o);
        } catch (e) {
            return false;
        }
    };

    /**
     * 判断变量是否为布尔值。
     *
     * @param o 变量
     * @returns {Boolean} 是否为布尔值：
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     */
    $.isBoolean = function (o) {
        try {
            if ($.type(o) === "boolean") {
                return true;
            }

            return false;
        } catch (e) {
            return false;
        }
    };

    /**
     * 检查邮箱格式是否正确。
     *
     * @param mail 邮箱
     * @returns {Boolean} 格式是否正确：
     * <ol>
     *    <li>true-正确；</li>
     *    <li>false-错误。</li>
     * </ol>
     */
    $.checkMail = function (mail) {
        if ($.isNotBlank(mail)) {
            if ((mail.length >= 5) && (mail.length <= 30)) {
                return mailRE.test(mail);
            }
        }

        return false;
    };

    /**
     * 显示等待模态框。
     *
     * @param settings 配置
     * <ol>
     *    <li>modal：true-显示；false-不显示；</li>
     *    <li>modalMsg：等待信息。</li>
     * </ol>
     */
    $.showLoadModal = function (settings) {
        // 遮罩层 HTML
        var modalHtml = "<div id='load_modal' class='modal-backdrop fade in load-modal' style='color: white; display: none; font-size: 30px; text-align: center; padding-top: 200px;'>" +
            "<i class='fa fa-spinner fa-spin fa-2x'></i>" +
            "<span></span>" +
            "</div>";
        // 获取遮罩层的 jQuery 对象
        var $loadModal = $("#load_modal");

        // 是否显示等待模态框，true-显示；false-不显示，默认：不显示
        settings.modal = (($.type(settings.modal) === "boolean") ? settings.modal : false);
        // 加载信息
        settings.modalMsg = ($.isBlank(settings.modalMsg) ? "" : (settings.modalMsg + "…"));

        // 显示遮罩层
        if (settings.modal) {
            if (!$.is_jQueryObj($loadModal)) {
                // 追加到页面中
                $("body").append(modalHtml);

                $loadModal = $("#load_modal");

                // 设置遮罩层上显示的消息
                $loadModal.find("span").html(settings.modalMsg);
                // 显示遮罩层
                $loadModal.css("display", "block");
            }

            // 隐藏遮罩层
        } else {
            if ($.is_jQueryObj($loadModal)) {
                $loadModal.remove();
            }
        }
    };

    /**
     * 显示消息模态框。
     *
     * @param msg 消息
     */
    $.showAlertModal = function (msg) {
        // 模态框 HTML
        var modalHtml = "<div id='alert_modal' role='dialog' class='modal fade' style='margin-top: 100px;' aria-hidden='true'>" +
            "<div class='modal-dialog' style='width: 450px;'>" +
            "<div class='modal-content'>" +
            "<div class='modal-header' style='color: white; height: 60px; overflow: hidden; line-height: 60px; white-space: nowrap; text-overflow: ellipsis; -o-text-overflow: ellipsis; background-color: #428BCA !important;'>" +
            "<h1 class='modal-title' style='font-size: 16px;'>消息</h1>" +
            "</div>" +
            "<div class='modal-body' style='overflow-x: hidden; overflow-y: auto; max-height: 400px;'>" +
            "<p style='font-size: 14px; word-wrap: break-word; word-break: break-all;'>消息！</p>" +
            "</div>" +
            "<div class='modal-footer' style='height: 60px; overflow: hidden; line-height: 60px; white-space: nowrap; padding-top: 0px; text-overflow: ellipsis; padding-bottom: 0px; -o-text-overflow: ellipsis; background-color: #E5E5E5; !important;'>" +
            "<button type='button' class='btn btn-primary' data-dismiss='modal'>确定</button>" +
            "</div></div></div></div>";
        // 获取模态框的 jQuery 对象
        var $alertModal = $("#alert_modal");

        // 修正参数
        msg = ($.isBlank(msg) ? "消息！" : msg);

        if (!$.is_jQueryObj($alertModal)) {
            // 追加到页面中
            $("body").append(modalHtml);

            $alertModal = $("#alert_modal");

            // 设置模态框上显示的消息
            $alertModal.find(".modal-body").find("p").html(msg);
            // 显示模态框
            $alertModal.modal("show");

            // 监听模态框对用户可见时触发
            $alertModal.on("shown.bs.modal", function () {
                var $this = $(this);

                $this.css("z-index", "10000");
                $this.next("div.modal-backdrop").css("z-index", "9999");
            });

            // 监听模态框完全对用户隐藏时触发
            $alertModal.on("hidden.bs.modal", function () {
                var $this = $(this);

                // 删除模态框
                $this.remove();
            });
        }
    };

    /**
     * 显示确认模态框。
     *
     * @param settings 配置
     */
    $.showConfirmModal = function (settings) {
        // 模态框 HTML
        var modalHtml = "<div id='confirm_modal' role='dialog' class='modal fade' style='margin-top: 100px;' aria-hidden='true'>" +
            "<div class='modal-dialog' style='width: 450px;'>" +
            "<div class='modal-content'>" +
            "<div class='modal-header' style='color: white; height: 60px; overflow: hidden; line-height: 60px; white-space: nowrap; text-overflow: ellipsis; -o-text-overflow: ellipsis; background-color: #428BCA !important;'>" +
            "<h1 class='modal-title' style='font-size: 16px;'>提示</h1>" +
            "</div>" +
            "<div class='modal-body' style='overflow-x: hidden; overflow-y: auto; max-height: 400px;'>" +
            "<p style='font-size: 14px; word-wrap: break-word; word-break: break-all;'>提示！</p>" +
            "</div>" +
            "<div class='modal-footer' style='height: 60px; overflow: hidden; line-height: 60px; white-space: nowrap; padding-top: 0px; text-overflow: ellipsis; padding-bottom: 0px; -o-text-overflow: ellipsis; background-color: #E5E5E5; !important;'>" +
            "<button type='button' class='btn btn-primary' style='margin-right: 10px;' data-name='cancel' data-dismiss='modal'>取消</button>" +
            "<button type='button' class='btn btn-danger' data-name='ok' data-dismiss='modal'>确定</button>" +
            "</div></div></div></div>";
        // 获取模态框的 jQuery 对象
        var $confirmModal = $("#confirm_modal");

        // 修正参数
        settings.msg = ($.isBlank(settings.msg) ? "提示！" : settings.msg);

        if (!$.is_jQueryObj($confirmModal)) {
            // 追加到页面中
            $("body").append(modalHtml);

            $confirmModal = $("#confirm_modal");

            // 获取模态框上的按钮
            var $btn = $confirmModal.find("button");
            // 按钮名称：cancel-取消；ok-确定
            var name = "";

            // 点击按钮
            $btn.click(function () {
                var $this = $(this);

                // 获取按钮名称
                name = $this.data("name");
            });

            // 设置模态框上显示的消息
            $confirmModal.find(".modal-body").find("p").html(settings.msg);
            // 显示模态框
            $confirmModal.modal("show");

            // 监听模态框对用户可见时触发
            $confirmModal.on("shown.bs.modal", function () {
                var $this = $(this);

                $this.css("z-index", "10000");
                $this.next("div.modal-backdrop").css("z-index", "9999");
            });

            // 监听模态框完全对用户隐藏时触发
            $confirmModal.on("hidden.bs.modal", function () {
                var $this = $(this);

                // 删除模态框
                $this.remove();

                // 如果点击确定按钮
                if ($.getString(name) === "ok") {
                    if ($.isFunction(settings.confirmFn)) {
                        settings.confirmFn();
                    }
                }
            });
        }
    };

    /**
     * 字符串换行处理。
     *
     * @param str 字符串
     * @param splitCount 每隔多个字符
     * @return {string} 换行后的字符串
     */
    $.newlineStr = function (str, splitCount) {
        // 换行后的字符串
        var newlineStr = "";

        str = $.getString(str);

        if ($.isBlank(str) || !$.isNumber(splitCount)) {
            return "";
        }

        splitCount = $.getNumber(splitCount);

        if ((splitCount <= 0) || (str.length <= splitCount)) {
            return str;
        } else {
            var split = (str.length / splitCount);

            for (var i = 0; i < split; i++) {
                if (i === 0) {
                    newlineStr += str.substring((i * splitCount), ((i + 1) * splitCount));
                } else {
                    newlineStr += ("\n" + str.substring((i * splitCount), ((i + 1) * splitCount)));
                }
            }

            // 非整除
            if ((str.length % splitCount) !== 0) {
                newlineStr += ("\n" + str.substring((split * splitCount)));
            }
        }

        return newlineStr;
    };

    /**
     * 中文字符串换行处理。
     *
     * @param chineseStr 中文字符串
     * @param splitCount 每隔多个中文换行
     * @return {string} 换行后的中文字符串，如果包含非中文字符串，将返回空串
     */
    $.newlineChineseStr = function (chineseStr, splitCount) {
        // 中文的正则表达式
        var chineseRE = /^[\u4e00-\u9fa5]+$/i;

        if ($.isBlank(chineseStr) || !chineseRE.test(chineseStr)) {
            return "";
        }

        return $.newlineStr(chineseStr, splitCount);
    };

    /**
     * 数组求和。
     *
     * @param arr 数字数组
     * @return {number} 和
     */
    $.sumArray = function (arr) {
        var sum = 0;

        if ($.isArray(arr)) {
            $.each(arr, function (i, e) {
                if ($.isNumber(e)) {
                    sum += Number(e);
                }
            });
        }

        return sum;
    };

    /**
     * 给对象数组中对象的某个字段求和。
     *
     * @param objArr 对象数组
     * @param objField 对象字段
     * @return {number} 和
     */
    $.sumObjArray = function (objArr, objField) {
        var sum = 0;

        objField = $.getString(objField);

        if ($.isArray(objArr) && $.isNotBlank(objField) && !$.isNumber(objField)) {
            $.each(objArr, function (i, e) {
                if ($.isObject(e)) {
                    var value = e[objField];

                    if ($.isNumber(value)) {
                        sum += Number(value);
                    }
                }
            });
        }

        return sum;
    };

    /**
     * 判断 str 是否以 startsStr 开始。
     *
     * @param str 字符串
     * @param startsStr 开始的字符串
     * @return {boolean}
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     */
    $.startsWithStr = function (str, startsStr) {
        str = $.getString(str);
        startsStr = $.getString(startsStr);

        if ($.isBlank(str) || $.isBlank(startsStr)) {
            return false;
        }

        if (str.indexOf(startsStr) === 0) {
            return true
        } else {
            return false;
        }
    };

    /**
     * 判断 str 是否以 endsStr 结束。
     *
     * @param str 字符串
     * @param endsStr 结束的字符串
     * @return {boolean}
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     */
    $.endsWithStr = function (str, endsStr) {
        str = $.getString(str);
        endsStr = $.getString(endsStr);

        if ($.isBlank(str) || $.isBlank(endsStr)) {
            return false;
        }

        if ((str.lastIndexOf(endsStr) + endsStr.length) === str.length) {
            return true
        } else {
            return false;
        }
    };

    /**
     * 给基本类型数组排序。
     *
     * @param arr 数组
     * @param sortBy 排序方式：
     * <ol>
     *    <li>asc-升序；</li>
     *    <li>desc-降序。</li>
     * </ol>
     *
     * @return {*|Array.<T>} 排序后的数组
     */
    $.sortArray = function (arr, sortBy) {
        if (!$.isArray(arr)) {
            return new Array();
        }

        if ($.isBlank(sortBy)) {
            return arr;
        }

        sortBy = $.getString(sortBy).toLowerCase();

        if (("asc" !== sortBy) && ("desc" !== sortBy)) {
            return arr;
        }

        // 比较器
        var compare = function (v1, v2) {
            // v1 和 v2 其中一个为空，禁止排序
            if ($.isBlank(v1) || $.isBlank(v2)) {
                return 0;
            }

            // 升序
            if (sortBy === "asc") {
                if (v1 > v2) {
                    return 1;
                } else if (v1 < v2) {
                    return -1;
                } else {
                    return 0;
                }

                // 降序
            } else if (sortBy === "desc") {
                if (v1 > v2) {
                    return -1;
                } else if (v1 < v2) {
                    return 1;
                } else {
                    return 0;
                }

                // 什么玩意？
            } else {
                return 0;
            }
        }

        return arr.sort(compare);
    };

    /**
     * 给对象数组排序。
     *
     * @param objArr 对象数组
     * @param sortField 排序字段
     * @param sortBy 排序方式：
     * <ol>
     *    <li>asc-升序；</li>
     *    <li>desc-降序。</li>
     * </ol>
     *
     * @return {*|Array.<T>} 排序后的数组
     */
    $.sortObjArray = function (objArr, sortField, sortBy) {
        if (!$.isArray(objArr)) {
            return new Array();
        }

        if ($.isBlank(sortField) || $.isNumber(sortField) || $.isBlank(sortBy)) {
            return objArr;
        }

        sortField = $.getString(sortField);
        sortBy = $.getString(sortBy).toLowerCase();

        if (("asc" !== sortBy) && ("desc" !== sortBy)) {
            return objArr;
        }

        // 比较器
        var compare = function (o1, o2) {
            // o1 和 o2 其中一个不为对象，禁止排序
            if (!$.isObject(o1) || !$.isObject(o2)) {
                return 0;
            }

            var v1 = ($.isNumber(o1[sortField]) ? Number(o1[sortField]) : 0);
            var v2 = ($.isNumber(o2[sortField]) ? Number(o2[sortField]) : 0);

            // 升序
            if (sortBy === "asc") {
                if (v1 > v2) {
                    return 1;
                } else if (v1 < v2) {
                    return -1;
                } else {
                    return 0;
                }

                // 降序
            } else if (sortBy === "desc") {
                if (v1 > v2) {
                    return -1;
                } else if (v1 < v2) {
                    return 1;
                } else {
                    return 0;
                }

                // 什么玩意？
            } else {
                return 0;
            }
        }

        return objArr.sort(compare);
    };

    /**
     * 根据 fieldKey 在 field 上从 objArr 中查找对象。
     *
     * @param objArr 对象数组
     * @param field 字段
     * @param fieldKey 字段键，即查找对象的字段值，在 objArr 中需要保证它是唯一的才有意义
     * @return {Object} key 对应的对象
     */
    $.getObjFromObjArray = function (objArr, field, fieldKey) {
        var obj = null;

        field = $.getString(field);
        fieldKey = $.getString(fieldKey);

        if ($.isArray(objArr) && //
            $.isNotBlank(field) && //
            !$.isNumber(field) && //
            $.isNotBlank(fieldKey)) {
            $.each(objArr, function (i, e) {
                if ($.isObject(e)) {
                    if ($.getString(e[field]) === fieldKey) {
                        obj = e;

                        // 终止循环
                        return false;
                    }
                }
            });
        }

        return obj;
    };

    /**
     * 根据 value 从 arr 中删除元素。
     *
     * @param arr 基本类型的数组
     * @param value 元素值
     */
    $.deleteInArray = function (arr, value) {
        value = $.getString(value);

        if ($.isArray(arr) && $.isNotBlank(value)) {
            $.each(arr, function (i, e) {
                if ($.isNotBlank(e)) {
                    if ($.getString(e) === value) {
                        arr.splice(i, 1);

                        // 终止循环
                        return false;
                    }
                }
            });
        }
    };


    /**
     * 根据 fieldKey 在 field 上从 objArr 中删除对象。
     *
     * @param objArr 对象数组
     * @param field 字段
     * @param fieldKey 字段键，即查找对象的字段值，在 objArr 中需要保证它是唯一的才有意义
     * @return {Object} key 对应的对象
     */
    $.deleteObjInObjArray = function (objArr, field, fieldKey) {
        field = $.getString(field);
        fieldKey = $.getString(fieldKey);

        if ($.isArray(objArr) && //
            $.isNotBlank(field) && //
            !$.isNumber(field) && //
            $.isNotBlank(fieldKey)) {
            $.each(objArr, function (i, e) {
                if ($.isObject(e)) {
                    if (e[field] == fieldKey) {
                        objArr.splice(i, 1);

                        // 终止循环
                        return false;
                    }
                }
            });
        }
    };

    /**
     * 将基本类型的数组转换为 split 拼接的字符串。
     *
     * @param arr 基本类型的数组
     * @param split 分隔符
     * @return {string} split 拼接的字符串
     */
    $.parseArray2Str = function (arr, split) {
        var splitStr = "";

        split = $.getString(split);

        if ($.isArray(arr)) {
            splitStr = arr.join(split);
        }

        return $.getString(splitStr);
    };

    /**
     * 根据 field 将对象数组转换为 split 拼接的字符串。
     *
     * @param objArr 对象数组
     * @param field 字段
     * @param split 分隔符
     * @return {string} split 拼接的字符串
     */
    $.parseObjArray2Str = function (objArr, field, split) {
        var splitStr = "";

        field = $.getString(field);
        split = $.getString(split);

        if ($.isArray(objArr) && //
            $.isNotBlank(field) && //
            !$.isNumber(field)) {
            $.each(objArr, function (i, e) {
                if ($.isObject(e)) {
                    if ($.isNotBlank(e[field])) {
                        splitStr += ($.getString(e[field]) + split);
                    }
                }
            });

            if ($.isNotBlank(splitStr)) {
                splitStr = splitStr.substring(0, (splitStr.length - 1));
            }
        }

        return $.getString(splitStr);
    };

    /**
     * 获取安全的字符串。
     *
     * @param str 字符串
     * @return {string} 安全的字符串
     */
    $.getString = function (str) {
        return ($.isBlank(str) ? "" : String(str));
    };

    /**
     * 获取安全的数字。
     *
     * @param num 数字
     * @return {number} 安全的数字
     */
    $.getNumber = function (num) {
        return ($.isNumber(num) ? Number(num) : 0);
    };

    /**
     * 获取安全的布尔。
     *
     * @param bl 布尔
     * @return {boolean} 安全的布尔
     */
    $.getBoolean = function (bl) {
        return ($.isBoolean(bl) ? Boolean(bl) : false);
    };

    /**
     * 判断是否拥有角色。
     *
     * @param role 角色
     * @return {boolean}
     * <ol>
     *    <li>true-已拥有；</li>
     *    <li>false-未拥有。</li>
     * </ol>
     */
    $.hasRole = function (role) {
        var flag = false;

        role = $.getString(role);

        if ($.isNotBlank(role) && $.isArray(globalLoginUserPerms)) {
            var roles = role.split("|");
            var count = 0;

            $.each(roles, function (i1, e1) {
                $.each(globalLoginUserRoles, function (i2, e2) {
                    if ($.getString(e1) === $.getString(e2)) {
                        count++;

                        return false;
                    }
                });
            });

            if (roles.length === count) {
                flag = true;
            }
        }

        return flag;
    };

    /**
     * 判断是否拥有权限。
     *
     * @param permission 权限，多个权限用“|”分隔
     * @return {boolean}
     * <ol>
     *    <li>true-已拥有；</li>
     *    <li>false-未拥有。</li>
     * </ol>
     */
    $.hasPermission = function (permission) {
        var flag = false;

        permission = $.getString(permission);

        if ($.isNotBlank(permission) && $.isArray(globalLoginUserPerms)) {
            var permissions = permission.split("|");
            var count = 0;

            $.each(permissions, function (i1, e1) {
                $.each(globalLoginUserPerms, function (i2, e2) {
                    if ($.getString(e1) === $.getString(e2)) {
                        count++;

                        return false;
                    }
                });
            });

            if (permissions.length === count) {
                flag = true;
            }
        }

        return flag;
    };

    /**
     * 显示 jQuery Ajax 错误信息。
     */
    /**
     *
     * @param jqXhr jQuery Ajax 对象
     */
    $.showAjaxErrorMsg = function (jqXhr) {
        if ($.isNotNull(jqXhr)) {
            // 获取状态码
            var statusCode = jqXhr.status;
            // 服务器返回的字符串
            var responseText = jqXhr.responseText;

            // 登录超时
            if (statusCode === 401) {
                $.showConfirmModal({
                    msg: "您已登录超时，确定重新登录吗？",
                    confirmFn: function () {
                        location.href = globalBasePath + "web/login.html";
                    }
                });

                // 未授权访问
            } else if (statusCode === 403) {
                $.showAlertModal("您没有权限访问此项，请联系管理员授权！");

                // 请求参数不合法
            } else if (statusCode === 412) {
                try {
                    var data = $.parseJSON(responseText);
                    var html = "";

                    $.each(data.results, function (i, e) {
                        html += ((i + 1) + "、" + e.field + "--->" + e.defaultMessage);

                        if (i < (data.results.length - 1)) {
                            html += "；<br>";
                        } else {
                            html += "。";
                        }
                    });

                    $.showAlertModal("您的请求参数不合法：<br>" + html);
                } catch (e) {
                    $.showAlertModal("您的请求参数不合法：<br>" + responseText);
                }

                // 访问的页面不存在
            } else if (statusCode === 404) {
                $.showAlertModal("您访问的页面不存在！");

                // 服务器内部错误
            } else if (statusCode === 500) {
                $.showAlertModal("系统繁忙，稍候再试！");

                // 其他
            } else {
                if (statusCode != 0) {
                    $.showAlertModal("请求状态码【" + statusCode + "】，" + "网络连接失败，稍候再试！");
                }
            }
        }
    };

    /**
     * 我的 Ajax。
     *
     * @param settings 配置
     */
    $.myAjax = function (settings) {
        // DOM ID，载入 HTML 片段的 DOM
        settings.id = ($.isBlank(settings.id) ? "#main-content-inner" : ("#" + settings.id));
        // 请求  Url
        settings.url = ($.isBlank(settings.url) ? (globalBasePath + "error/xxx.html") : (globalBasePath + settings.url));
        // 请求方式
        settings.type = ($.isBlank(settings.type) ? "get" : settings.type.toLowerCase());
        // 是否异步：true-是；false-否
        settings.async = (($.type(settings.async) === "boolean") ? settings.async : true);
        // URL 是否路由：true-是；false-否
        settings.route = (($.type(settings.route) === "boolean") ? settings.route : false);
        // 是否显示等待模态框，true-显示；false-不显示，默认：不显示
        settings.modal = (($.type(settings.modal) === "boolean") ? settings.modal : false);
        // 返回数据的类型，默认为 json
        settings.dataType = ($.isBlank(settings.dataType) ? "json" : settings.dataType.toLowerCase());
        // 加载信息
        settings.modalMsg = ($.isBlank(settings.modalMsg) ? "" : settings.modalMsg);
        // 提交按钮
        settings.submitBtn = ($.is_jQueryObj(settings.submitBtn) ? settings.submitBtn : null);
        // 提交按钮的信息
        settings.submitMsg = ($.isBlank(settings.submitMsg) ? "正在提交…" : (settings.submitMsg + "…"));

        /*
         * 在数据类型为“html”的前提下，showHtml 的默认值为 true，数据类型为其他时，showHtml 的值为 false。
         * 1.true-立即显示 html；
         * 2.false-不立即显示 html。
         *
         */
        if (settings.dataType === "html") {
            settings.showHtml = (($.type(settings.showHtml) === "boolean") ? settings.showHtml : true);
        } else {
            settings.showHtml = false;
        }

        // 请求参数
        // 请求参数为对象
        if ($.isObject(settings.data)) {
            settings.data._ = new Date().getTime();

            // 请求参数为数组
        } else if ($.isArray(settings.data)) {
            settings.data.push({
                name: "_",
                value: new Date().getTime()
            });

            // 请求参数为空
        } else {
            settings.data = new Object();
            settings.data._ = new Date().getTime();
        }

        var jqXhr = $.ajax({
            url: settings.url,
            type: settings.type,
            data: settings.data,
            async: settings.async,
            dataType: settings.dataType,
            beforeSend: function (jqXhr) { // 请求之前
                ajaxCount++;

                if (settings.modal) {
                    loadingAjaxCount++;

                    if (loadingAjaxCount === 1) {
                        // 显示等待模态框
                        $.showLoadModal({
                            modal: settings.modal,
                            modalMsg: settings.modalMsg
                        });
                    }
                }

                if ($.is_jQueryObj(settings.submitBtn) && (ajaxCount === 1)) {
                    submitBtnName = settings.submitBtn.html();

                    // 禁用提交按钮
                    settings.submitBtn.html("<i class='fa fa-spinner fa-spin'></i>" + settings.submitMsg).attr({"disabled": "disabled"});
                }

                if ($.isFunction(settings.beforeSendFn)) {
                    settings.beforeSendFn(jqXhr);
                }
            },
            complete: function (jqXhr, textStatus) { // 请求完成
                if (ajaxCount > 0) {
                    ajaxCount--;
                }

                if (settings.modal) {
                    if (loadingAjaxCount > 0) {
                        loadingAjaxCount--;
                    }

                    if (loadingAjaxCount === 0) {
                        // 隐藏等待模态框
                        $.showLoadModal({
                            modal: false
                        });
                    }
                }

                if ($.is_jQueryObj(settings.submitBtn) && (ajaxCount === 0)) {
                    // 启用提交按钮
                    settings.submitBtn.html(submitBtnName).removeAttr("disabled");
                }

                if ($.isFunction(settings.completeFn)) {
                    settings.completeFn(jqXhr, textStatus);
                }
            },
            success: function (data, textStatus, jqXhr) { // 请求成功
                // 如果返回数据的类型为：json
                if (settings.dataType === "json") {
                    if (data.resultCode === 0) {
                        if ($.isFunction(settings.successFn)) {
                            settings.successFn(data, textStatus, jqXhr);
                        }
                    } else {
                        $.showAlertModal(data.resultMsg);

                        if ($.isFunction(settings.successErrorFn)) {
                            settings.successErrorFn(data, textStatus, jqXhr);
                        }
                    }

                    // 如果返回数据的类型为：html
                } else if (settings.dataType === "html") {
                    if ($.isObject(data)) {
                        if (data.resultCode != 0) {
                            $.showAlertModal(data.resultMsg);
                        }
                    } else {
                        if (settings.showHtml) {
                            $(settings.id).html(data);
                        }
                    }

                    if ($.isFunction(settings.successFn)) {
                        settings.successFn(data, textStatus, jqXhr);
                    }

                    // 如果返回数据的类型为：其他
                } else {
                    if ($.isFunction(settings.successFn)) {
                        settings.successFn(data, textStatus, jqXhr);
                    }
                }
            },
            error: function (jqXhr, textStatus, errorThrown) { // 请求失败
                $.showAjaxErrorMsg(jqXhr);

                if ($.isFunction(settings.errorFn)) {
                    settings.errorFn(jqXhr, textStatus, errorThrown);
                }
            }
        });

        return jqXhr;
    };

    /**
     * 我的 Load Ajax。
     *
     * @param settings 配置
     */
    $.fn.myLoad = function (settings) {
        // 请求  Url
        settings.url = ($.isBlank(settings.url) ? (globalBasePath + "error/xxx.html") : (globalBasePath + settings.url));
        // 请求参数，默认使用 GET 方式-传递附加参数时自动转换为 POST 方式
        settings.data = ($.isObject(settings.data) ? settings.data : null);
        // 是否显示等待模态框，true-显示；false-不显示，默认：不显示
        settings.modal = (($.type(settings.modal) === "boolean") ? settings.modal : false);
        // 加载信息
        settings.modalMsg = ($.isBlank(settings.modalMsg) ? "" : settings.modalMsg);

        // 当前对象
        var $this = this;

        // 显示等待模态框
        $.showLoadModal({
            modal: settings.modal,
            modalMsg: settings.modalMsg
        });

        $this.load(
            settings.url,
            settings.data,
            function (data) {
                // 隐藏等待模态框
                $.showLoadModal({
                    modal: false
                });

                if ($.isFunction(settings.successFn)) {
                    settings.successFn($this, data);
                }
            }
        );
    };
})(jQuery);